home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Compendium Deluxe 3
/
LSD Compendium Deluxe 3 (1995).iso
/
sys
/
archives
/
aguid343.lha
/
AmigaGuide.lha
/
AG_V34
/
Source
/
HyperApp.c
next >
Wrap
C/C++ Source or Header
|
1992-12-30
|
15KB
|
681 lines
/* HyperApp.c
*/
#include <exec/types.h>
#include <exec/libraries.h>
#include <intuition/intuition.h>
#include <graphics/gfx.h>
#include <graphics/text.h>
#include <libraries/amigaguide.h>
#include <clib/alib_protos.h>
#include <clib/exec_protos.h>
#include <clib/intuition_protos.h>
#include <clib/graphics_protos.h>
#include <clib/amigaguide_protos.h>
#include <pragmas/amigaguide_pragmas.h>
#include <stdio.h>
#define DB(x) ;
struct AppInfo
{
struct Window *ai_Window; /* Window pointer */
BOOL ai_Done; /* Done yet? */
AMIGAGUIDECONTEXT ai_AmigaGuide; /* Pointer to the AmigaGuide context */
LONG ai_Region; /* Region that the mouse if over */
struct TextFont *ai_Font; /* Window font */
};
struct FuncTable
{
VOID (*ft_Func) (struct AppInfo *);
};
struct EMenuItem
{
struct MenuItem em_MenuItem; /* Embedded menu structure */
LONG em_MenuID; /* Menu ID */
};
extern struct Library *SysBase, *DOSBase;
struct Library *IntuitionBase, *GfxBase, *AmigaGuideBase;
VOID MainFunc (struct AppInfo *);
VOID QuitFunc (struct AppInfo *);
VOID GadgetFunc (struct AppInfo *);
VOID OkayFunc (struct AppInfo *);
VOID CancelFunc (struct AppInfo *);
/* Context ID's to be sent to AmigaGuide */
STRPTR context[] =
{
"MAIN",
"QUIT",
"GADGET",
"OKAY",
"CANCEL",
NULL
};
/* Simple little prompts to display within the application window */
STRPTR quickhelp[] =
{
"HyperApp Main Window",
"",
"Transmogrify Objects",
"Positive Quit",
"Negative Quit",
NULL
};
struct FuncTable Funcs[] =
{
MainFunc,
QuitFunc,
GadgetFunc,
OkayFunc,
CancelFunc,
NULL
};
struct TextAttr TOPAZ8 =
{(STRPTR) "topaz.font", 8, 0, 0};
struct IntuiText IText3 =
{
0, 0, JAM1, 2, 1, &TOPAZ8, "Quit", NULL
};
struct EMenuItem MenuItem1 =
{
NULL, 0, 0, 142, 9, ITEMTEXT | COMMSEQ | ITEMENABLED | HIGHCOMP,
0, (APTR) & IText3, NULL, 'Q', NULL, MENUNULL, 1L
};
struct Menu Menu1 =
{
NULL, 2, 0, 64, 0, MENUENABLED, "Project", (struct MenuItem *) & MenuItem1
};
SHORT BData1[] =
{0, 0, 94, 0, 94, 13, 0, 13, 0, 0};
SHORT BData2[] =
{0, 0, 94, 0, 94, 13, 0, 13, 0, 0};
struct Border Border1 =
{0, 0, 1, 0, JAM1, 5, BData1, NULL};
struct Border Border2 =
{0, 0, 1, 0, JAM1, 5, BData2, NULL};
struct IntuiText IText1 =
{1, 0, JAM2, 26, 3, &TOPAZ8, "Cancel", NULL};
struct IntuiText IText2 =
{1, 0, JAM2, 40, 3, &TOPAZ8, "OK", NULL};
struct Gadget Gadget3 =
{
NULL, -120, -18, 95, 14, GRELBOTTOM | GRELRIGHT, RELVERIFY, BOOLGADGET,
(APTR) & Border1, NULL, &IText1, NULL, NULL, 4L, NULL
};
struct Gadget Gadget2 =
{
&Gadget3, 12, -18, 95, 14, GRELBOTTOM, RELVERIFY, BOOLGADGET,
(APTR) & Border2, NULL, &IText2, NULL, NULL, 3L, NULL
};
struct Gadget Gadget1 =
{
&Gadget2, 12, 27, -40, -48, GADGHCOMP | GRELWIDTH | GRELHEIGHT | SELECTED,
TOGGLESELECT | RELVERIFY, BOOLGADGET, NULL, NULL, NULL, NULL, NULL,
2L, NULL
};
struct TagItem WinTags[] =
{
WA_MenuHelp, TRUE,
TAG_DONE,
};
/* NewWindow Structures */
struct ExtNewWindow NewWindowStructure1 =
{
0, 0, 640, 100, -1, -1,
IDCMP_RAWKEY | IDCMP_CLOSEWINDOW | IDCMP_MENUPICK | IDCMP_MENUHELP |
IDCMP_GADGETUP | IDCMP_MOUSEMOVE,
WINDOWSIZING | WINDOWDRAG | WINDOWDEPTH | WINDOWCLOSE | WFLG_REPORTMOUSE |
SIZEBRIGHT | ACTIVATE | NOCAREREFRESH | WFLG_NW_EXTENDED,
&Gadget1, NULL, "HyperApp (Press HELP over Gadget or Menu)", NULL, NULL,
320, 50, 65535, 65535, WBENCHSCREEN, WinTags,
};
/* Determine if a point is within a rectangle */
ULONG PointInBox (WORD x, WORD y, struct IBox * box)
{
if ((x >= box->Left) &&
(x <= (box->Left + box->Width)) &&
(y >= box->Top) &&
(y <= (box->Top + box->Height)))
{
return (1L);
}
return (0L);
}
/* Find the rectangle of a gadget */
VOID gadgetBox (struct Gadget * g, struct IBox * domain, struct IBox * box)
{
/* Set the 'normal' rectangle */
box->Left = g->LeftEdge;
box->Top = g->TopEdge;
box->Width = g->Width;
box->Height = g->Height;
/* Check for relativity */
if (g->Flags & GRELRIGHT)
box->Left += domain->Width - 1;
if (g->Flags & GRELBOTTOM)
box->Top += domain->Height - 1;
if (g->Flags & GRELWIDTH)
box->Width += domain->Width;
if (g->Flags & GRELHEIGHT)
box->Height += domain->Height;
}
/* Process menu events */
VOID HandleMenuEvent (struct IntuiMessage * msg)
{
struct Window *win = msg->IDCMPWindow;
struct AppInfo *ai = (struct AppInfo *) win->UserData;
UWORD selection = msg->Code;
struct EMenuItem *item;
/* Turn off the menu button */
win->Flags |= RMBTRAP;
/* Process all menu events */
while (selection != MENUNULL)
{
/* Get the MenuItem structure address */
if (item = (struct EMenuItem *)
ItemAddress (win->MenuStrip, (LONG) selection))
{
(*(Funcs[item->em_MenuID].ft_Func)) (ai);
/* Get the next selection */
selection = item->em_MenuItem.NextSelect;
}
else
{
selection = MENUNULL;
}
}
/* Turn menu events back on. */
win->Flags &= ~RMBTRAP;
}
/* Process MenuHelp events */
VOID HandleMenuHelp (struct IntuiMessage * msg)
{
struct Window *win = msg->IDCMPWindow;
struct AppInfo *ai = (struct AppInfo *) win->UserData;
struct EMenuItem *item;
WORD mnum, inum, snum;
mnum = MENUNUM (msg->Code);
inum = ITEMNUM (msg->Code);
snum = SUBNUM (msg->Code);
printf ("m %d i %d s %d\n", mnum, inum, snum);
/* Get the MenuItem structure address */
if (item = (struct EMenuItem *)
ItemAddress (win->MenuStrip, (LONG) msg->Code))
{
/* Set the AmigaGuide context */
SetAmigaGuideContext (ai->ai_AmigaGuide, item->em_MenuID, NULL);
/* Display the node */
SendAmigaGuideContext (ai->ai_AmigaGuide, NULL);
}
else
{
/* No selectable item where help was pressed */
printf ("No item here\n");
}
}
/* Process MouseMove events */
VOID HandleMouseMove (struct IntuiMessage * msg)
{
struct Window *win = msg->IDCMPWindow;
struct AppInfo *ai = (struct AppInfo *) win->UserData;
struct Gadget *gad = win->FirstGadget;
struct IBox box;
LONG region;
if ((msg->MouseX < 0) || (msg->MouseX > win->Width) ||
(msg->MouseY < 0) || (msg->MouseY > win->Height))
{
region = -1L;
}
else
{
region = 0L;
/* Step through the gadgets to see which one the pointer was over */
while (gad && (region == 0L))
{
/* Calculate the gadget rectangle */
gadgetBox (gad, (struct IBox *) & (win->LeftEdge), &box);
/* Is the pointer within this gadget? */
if (PointInBox (msg->MouseX, msg->MouseY, &box))
{
/* Is it a system gadget? */
if (!(gad->GadgetType & GTYP_SYSGADGET))
{
/* Set the region */
region = (LONG) gad->GadgetID;
}
}
/* Get the next gadget */
gad = gad->NextGadget;
}
}
if (region != ai->ai_Region)
{
WORD tx, ty;
WORD bx, by;
tx = win->BorderLeft + 8;
ty = win->BorderTop + 2;
bx = win->Width - (win->BorderRight + 8);
by = ty + win->RPort->TxHeight;
SetDrMd (win->RPort, JAM1);
/* Clear the quick help region */
SetAPen (win->RPort, 0);
RectFill (win->RPort, tx, ty, bx, by);
/* Remember the region */
ai->ai_Region = region;
/* Display the quick help if within the window */
if (region >= 0)
{
SetAPen (win->RPort, 1);
Move (win->RPort, tx, ty + win->RPort->TxBaseline);
Text (win->RPort, quickhelp[region], strlen (quickhelp[region]));
}
}
}
/* Process GadgetHelp events */
VOID HandleGadgetHelp (struct IntuiMessage * msg)
{
struct Window *win = msg->IDCMPWindow;
struct AppInfo *ai = (struct AppInfo *) win->UserData;
struct Gadget *gad = win->FirstGadget;
struct IBox box;
LONG region;
region = 0L;
/* Step through the gadgets to see which one the pointer was over */
while (gad && (region == 0L))
{
/* Calculate the gadget rectangle */
gadgetBox (gad, (struct IBox *) & (win->LeftEdge), &box);
/* Is the pointer within this gadget? */
if (PointInBox (msg->MouseX, msg->MouseY, &box))
{
/* Is it a system gadget? */
if (gad->GadgetType & GTYP_SYSGADGET)
{
ULONG sys;
/* Which system gadget? */
sys = (ULONG) ((gad->GadgetType & 0xF0) / 16);
/* Set the region */
region = HTFC_SYSGADS + sys;
}
else
{
/* Set the region */
region = (LONG) gad->GadgetID;
}
}
/* Get the next gadget */
gad = gad->NextGadget;
}
/* Set the AmigaGuide context. */
SetAmigaGuideContext (ai->ai_AmigaGuide, region, NULL);
/* Display the current node */
SendAmigaGuideContext (ai->ai_AmigaGuide, NULL);
}
/* Process Gadget events */
VOID HandleGadgetEvent (struct IntuiMessage * msg)
{
struct Window *win = msg->IDCMPWindow;
struct AppInfo *ai = (struct AppInfo *) win->UserData;
struct Gadget *gad = (struct Gadget *) msg->IAddress;
if (gad)
{
(*(Funcs[gad->GadgetID].ft_Func)) (ai);
}
}
/* Process Intuition messages */
VOID HandleIDCMP (struct AppInfo * ai)
{
struct Window *win = ai->ai_Window;
struct IntuiMessage *imsg;
while (imsg = (struct IntuiMessage *) GetMsg (win->UserPort))
{
switch (imsg->Class)
{
case IDCMP_MOUSEMOVE:
HandleMouseMove (imsg);
break;
case IDCMP_CLOSEWINDOW:
ai->ai_Done = TRUE;
break;
case IDCMP_MENUPICK:
HandleMenuEvent (imsg);
break;
case IDCMP_MENUHELP:
HandleMenuHelp (imsg);
break;
case IDCMP_GADGETUP:
HandleGadgetEvent (imsg);
break;
case IDCMP_RAWKEY:
if (imsg->Code == 95)
{
HandleGadgetHelp (imsg);
}
break;
}
/* Reply to the message */
ReplyMsg ((struct Message *) imsg);
}
}
VOID DisplayError (LONG err)
{
printf ("%s\n", GetAmigaGuideString (err));
}
STRPTR err_type[] =
{
"NO ERROR",
"HTERR_NOT_ENOUGH_MEMORY",
"HTERR_CANT_OPEN_DATABASE",
"HTERR_CANT_FIND_NODE",
"HTERR_CANT_OPEN_NODE",
"HTERR_CANT_OPEN_WINDOW",
"HTERR_INVALID_COMMAND",
"HTERR_CANT_COMPLETE",
"HTERR_PORT_CLOSED",
"HTERR_CANT_CREATE_PORT",
NULL
};
STRPTR msg_type[] =
{
"<unknown>",
"StartupMsgID",
"LoginToolID",
"LogoutToolID",
"ShutdownMsgID",
"ActivateToolID",
"DeactivateToolID",
"ActiveToolID",
"InactiveToolID",
"ToolStatusID",
"ToolCmdID",
"ToolCmdReplyID",
"ShutdownToolID",
NULL
};
VOID display_msg (struct AmigaGuideMsg * msg)
{
LONG type, err;
type = msg->agm_Type - StartupMsgID + 1;
err = msg->agm_Sec_Ret - HTERR_NOT_ENOUGH_MEMORY + 1;
if (err < 0)
err = 0;
if (type < 0)
type = 0;
if (msg->agm_Msg.mn_Node.ln_Type == NT_REPLYMSG)
{
DB (kprintf ("Reply "));
}
else if (msg->agm_Msg.mn_Node.ln_Type == NT_MESSAGE)
{
DB (kprintf ("Message "));
}
else
{
DB (kprintf ("Unknown "));
}
DB (kprintf ("%s : %s\n", msg_type[type], err_type[err]));
}
/* Process AmigaGuide messages */
VOID HandleAmigaGuide (struct AppInfo * ai)
{
struct AmigaGuideMsg *agm;
/* process amigaguide messages */
while (agm = GetAmigaGuideMsg (ai->ai_AmigaGuide))
{
DB (display_msg (agm));
/* check message types */
switch (agm->agm_Type)
{
/* AmigaGuide is ready for us */
case ActiveToolID:
break;
/* This is a reply to our cmd */
case ToolCmdReplyID:
if (agm->agm_Pri_Ret)
{
DisplayError (agm->agm_Sec_Ret);
}
break;
/* This is a status message */
case ToolStatusID:
if (agm->agm_Pri_Ret)
{
DisplayError (agm->agm_Sec_Ret);
}
break;
/* Shutdown message */
case ShutdownMsgID:
if (agm->agm_Pri_Ret)
{
DisplayError (agm->agm_Sec_Ret);
}
break;
default:
break;
}
/* Reply to the message */
ReplyAmigaGuideMsg (agm);
}
}
main (int argc, char **argv)
{
struct NewAmigaGuide nag = {NULL};
struct AppInfo ai = {NULL};
/* Initialize the global data */
ai.ai_Region = -1;
/* Open Intuition library */
IntuitionBase = OpenLibrary ("intuition.library", 0);
/* Open the graphics library */
GfxBase = OpenLibrary ("graphics.library", 0);
/* amigaguide.library works with 1.3 and newer versions of the OS */
if (AmigaGuideBase = OpenLibrary ("amigaguide.library", 33))
{
/* Open the window font */
if (ai.ai_Font = OpenFont (&TOPAZ8))
{
/* Open the window */
if (ai.ai_Window = OpenWindow (&NewWindowStructure1))
{
ULONG sigr = 0L, sigi = 0L, sigb = 0L;
/* Set the window font */
SetFont (ai.ai_Window->RPort, ai.ai_Font);
/* Set the menu */
SetMenuStrip (ai.ai_Window, &Menu1);
/* Remember the AppInfo */
ai.ai_Window->UserData = (APTR) & ai;
/* Show that we're not done running the application yet */
ai.ai_Done = FALSE;
/* Set the application base name */
nag.nag_BaseName = "HyperApp";
/* Set the document name */
nag.nag_Name = "hyperapp.guide";
/* establish the base name to use for hypertext ARexx port */
nag.nag_ClientPort = "AGAPP_HELP";
/* Set up the context table */
nag.nag_Context = context;
/* Open the help system */
ai.ai_AmigaGuide = OpenAmigaGuideAsync (&nag, NULL);
/* Get our signal bits */
sigb = AmigaGuideSignal (ai.ai_AmigaGuide);
sigi = (1L << ai.ai_Window->UserPort->mp_SigBit);
/* Clear the AmigaGuide context */
SetAmigaGuideContext (ai.ai_AmigaGuide, 0L, NULL);
/* Continue until done */
while (!(ai.ai_Done))
{
/* Wait for something to happen */
sigr = Wait (sigb | sigi);
/* Process Intuition messages */
if (sigr & sigi)
{
HandleIDCMP (&ai);
}
/* Process AmigaGuide messages */
if (sigr & sigb)
{
HandleAmigaGuide (&ai);
}
}
/* Shutdown the help system */
CloseAmigaGuide (ai.ai_AmigaGuide);
/* Do we have a menu? */
if (ai.ai_Window->MenuStrip)
{
/* Clear it */
ClearMenuStrip (ai.ai_Window);
}
/* Close the application window */
CloseWindow (ai.ai_Window);
}
/* Close the font */
CloseFont (ai.ai_Font);
}
/* close the library */
CloseLibrary (AmigaGuideBase);
}
CloseLibrary (GfxBase);
CloseLibrary (IntuitionBase);
}
VOID MainFunc (struct AppInfo * ai)
{
printf ("I don't do anything...\n");
}
VOID QuitFunc (struct AppInfo * ai)
{
/* All done, guys */
ai->ai_Done = TRUE;
}
VOID GadgetFunc (struct AppInfo * ai)
{
printf ("Pressed the big gadget\n");
}
VOID OkayFunc (struct AppInfo * ai)
{
/* All done, guys */
ai->ai_Done = TRUE;
}
VOID CancelFunc (struct AppInfo * ai)
{
/* All done, guys */
ai->ai_Done = TRUE;
}